<?php

App::uses('Cne', 'Lib');
App::uses('Rif', 'Lib');

class ClientesController extends AppController {

    var $name = 'Clientes';
    var $components = array('Vista', 'Maestro', 'Interfaz', 'Consultas');
    var $uses = array('Usuario', 'Cliente', 'TipoCliente', 'Programa', 'Lapso', 'Material', 'ConsultaLegal', 'Saime', 'Runoppa');
    var $helpers = array('Interfaz');
    var $layout = 'ajax';
    var $paginate = array('limit' => 10, 'order' => array('Cliente.id' => 'DESC'));

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }

    public function buscar_cliente($busqueda = null) {
        extract($this->request->data);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $opcionTipoDoc = array(array('PN' => 'P Natural'), array('PJ' => 'P Juridica'));
        $listaCondicion = array(1 => 'Credito', 2 => 'Contado'/* , 3 => 'Donaciones' */);
        $listaLapsos = $this->Lapso->find('list', array('fields' => 'Lapso.id, Lapso.nombre', 'conditions' => array('Lapso.estatus' => 1), 'order' => 'Lapso.id'));
        $listaTipoCli = $this->TipoCliente->find('list', array('fields' => 'TipoCliente.id, TipoCliente.nombre', 'conditions' => array('TipoCliente.estatus' => 1), 'order' => 'TipoCliente.id'));
        $listaProgramas = $this->Programa->find('list', array('fields' => 'Programa.id, Programa.nombre', 'conditions' => array('Programa.estatus' => 1), 'order' => 'Programa.nombre'));
        $listaCartas = $listaNotas = $listaDeudas = array();
        $tipoBusqueda = (isset($tipoBusqueda)) ? $tipoBusqueda : '';
        $listado = false;
        $sistema = $ced_rifEnviada = '';

        if(isset($ced_rif))
            $ced_rifEnviada = $ced_rif;
        
        $documento = (empty($busqueda)) ? $this->Interfaz->formatocedula(strtoupper($ced_rif), false) : null;
        
        if(!empty($clienteID)) {
            $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
            $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
            $objDev = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
            $configPunto = $this->Session->read('configPunto');
            if($configPunto['Punto']['fac_dir'] == 0) {
                switch ($tabla) {
                    case 'F':
                        $doc = $this->Interfaz->id($doc);
                        $data = $objCot->find('first', array('conditions' => array('Cotizacion.id' => $doc)));
                    break;
                    case 'D':
                        $doc = $this->Interfaz->id($doc);
                        $dataFac = $objFac->find('first', array('fields' => array('Facturacion.cotizacion_id'), 'conditions' => array('Facturacion.id' => $doc)));
                        $data = $objCot->find('first', array('conditions' => array('Cotizacion.id' => $dataFac['Facturacion']['cotizacion_id'])));
                        $data['Cotizacion']['fecha'] = $data['Cotizacion']['fecha_procesada'];
                    break;
                }
            }
            $clienteID = $this->Interfaz->id($clienteID);
            $cliente[0] = $this->Cliente->find('first', array('fields' => 'Cliente.id, Cliente.tipo_doc, Cliente.documento, Cliente.nombre, Cliente.direccion, Cliente.telefono, Cliente.celular, Cliente.tipo_cliente_id, Cliente.estado_id, Cliente.municipio_id, Cliente.parroquia_id, Cliente.credito', 'conditions' => array('Cliente.id' => $clienteID, 'Cliente.estatus' => 1, 'TipoCliente.estatus' => 1)));
            if(!empty($data))
                $cliente[0]['Cotizacion'] = $data['Cotizacion'];
            $tipoBusqueda = $cliente[0]['Cliente']['tipo_doc'];
        } else {
            if($documento != null) {
                $cliente = $this->Cliente->find('all', array('fields' => 'Cliente.id, Cliente.tipo_doc, Cliente.documento, Cliente.nombre, Cliente.direccion, Cliente.telefono, Cliente.celular, Cliente.tipo_cliente_id, Cliente.estado_id, Cliente.municipio_id, Cliente.parroquia_id, Cliente.credito', 'conditions' => array('Cliente.documento' => $documento, 'Cliente.estatus' => 1, 'TipoCliente.estatus' => 1), 'order' => 'Cliente.id'));
                if(count($cliente) > 1)
                    $cliente = $this->Cliente->find('all', array('fields' => 'Cliente.id, Cliente.tipo_doc, Cliente.documento, Cliente.nombre, Cliente.direccion, Cliente.telefono, Cliente.celular, Cliente.tipo_cliente_id, Cliente.estado_id, Cliente.municipio_id, Cliente.parroquia_id, Cliente.credito', 'conditions' => array('Cliente.documento' => $documento, 'Cliente.tipo_doc' => $tipoBusqueda, 'Cliente.estatus' => 1, 'TipoCliente.estatus' => 1), 'order' => 'Cliente.id'));
            } elseif($busqueda != null) {
                $listado = true;
                $condiciones = array();
                $condiciones['Cliente.nombre ILIKE '] = "%$busqueda%";
                $cliente = $this->paginate($this->Cliente, array($condiciones));
            }
        }

        if(count($cliente) > 1 || $listado) {
            $this->set('url', $busqueda);
            $this->set('data', $cliente);
            $this->render('listado_clientes');
        } else {
            $sepCedRif = explode('-', $ced_rif);
            $ced_rif = $sepCedRif[0] . (int) $sepCedRif[1];
            $dataRunoppa = $this->Runoppa->find('first', array('fields' => 'nac_cedula', 'conditions' => array('Runoppa.nac_cedula' => $ced_rif)));
            
            if (empty($cliente)) {
                $datosCliente = array('id', 'tipo_doc', 'nombre', 'tipo_cliente_id', 'telefono', 'celular', 'direccion', 'estado_id', 'municipio_id', 'parroquia_id');
                $cliente[0]['Cliente']['documento'] = $documento;
                foreach ($datosCliente as $info)
                    $cliente[0]['Cliente'][$info] = '';
                unset($listaCondicion[1]);
            } else {
                $objCarOrd = $this->Maestro->modelo('punto', 'CartaOrden', $tiendaSesion);
                $objNotCre = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);

                if ($cliente[0]['Cliente']['credito'] == 0)
                    unset($listaCondicion[1]);

                $original = array();
                $original['TDO'] = $cliente[0]['Cliente']['tipo_doc'];
                $original['DOC'] = $documento;
                $original['NOM'] = $cliente[0]['Cliente']['nombre'];
                $original['TLF'] = $cliente[0]['Cliente']['telefono'];
                $original['CEL'] = $cliente[0]['Cliente']['celular'];
                $original['DIR'] = $cliente[0]['Cliente']['direccion'];
                $original['EST'] = $cliente[0]['Cliente']['estado_id'];
                $original['MUN'] = $cliente[0]['Cliente']['municipio_id'];
                $original['PAR'] = $cliente[0]['Cliente']['parroquia_id'];
                $this->set('sesionCliente', json_encode($original));

                $objCarOrd->virtualFields['id'] = '4 || \'_\' || CartaOrden.id';
                $objCarOrd->virtualFields['nombre'] = 'CartaOrden.numero || \' | (\' || REPLACE((CartaOrden.monto - CartaOrden.pagado)::text, \'.\', \',\') || \' Bs)\'';
                $listaCartas = $objCarOrd->find('list', array('fields' => 'id, nombre', 'conditions' => array('CartaOrden.estatus' => 1, 'CartaOrden.cliente_id' => $cliente[0]['Cliente']['id']), 'order' => '(CartaOrden.monto - CartaOrden.pagado)'));

                $objNotCre->virtualFields['id'] = '3 || \'_\' || NotaCredito.id';
                $objNotCre->virtualFields['nombre'] = 'NotaCredito.numero || \' | (\' || REPLACE((NotaCredito.monto - NotaCredito.pagado)::text, \'.\', \',\') || \' Bs)\'';
                $listaNotas = $objNotCre->find('list', array('fields' => 'id, nombre', 'conditions' => array('NotaCredito.estatus' => 1, 'NotaCredito.cliente_id' => $cliente[0]['Cliente']['id']), 'order' => '(NotaCredito.monto - NotaCredito.pagado)'));
                
                $sql = "SELECT * FROM cobranzas.fnc_deudas_cliente('$documento') AS (id bigint, tienda character varying(5), numfac character varying(25), fecemi date, monto double precision, pagado double precision, deuda double precision ,usuario character(30), estatus bigint ,documento character varying(15), sistema integer)";
                $dataDeuda = $this->Cliente->query($sql);
                foreach($dataDeuda as $valor) {
                    switch ($valor[0]['sistema']) {
                        case 1:
                            $sistema = 'SIGESP HISTORICO';
                        break;
                        case 2:
                            $sistema = 'SIGESP FACTURACION';
                        break;
                        case 3:
                            $sistema = 'ARAUCA';
                        break;
                    }
                    if(!isset($listaDeudas[$sistema]))
                        $listaDeudas[$sistema] = 0;
                    
                    $listaDeudas[$sistema] += $valor[0]['deuda'];
                }
            }

            $this->set('ced_rifEnviada', $ced_rifEnviada);
            $this->set('tipoBusqueda', $tipoBusqueda);
            $this->set('listaProgramas', $listaProgramas);
            $this->set('listaCondicion', $listaCondicion);
            $this->set('listaLapsos', $listaLapsos);
            $this->set('listaE', $this->Maestro->lista_estados());
            $this->set('listaM', $this->Maestro->lista_municipios($cliente[0]['Cliente']['estado_id']));
            $this->set('listaPar', $this->Maestro->lista_parroquias($cliente[0]['Cliente']['municipio_id']));
            $this->set('listaTipoCli', $listaTipoCli);
            $this->set('opcionTipoDoc', $opcionTipoDoc);
            $this->set('id_formulario', $formulario);
            $this->set('data', $cliente[0]);
            $this->set('listaCartas', $listaCartas);
            $this->set('listaNotas', $listaNotas);
            $this->set('listaDeudas', $listaDeudas);
            $this->set('dataRunoppa', $dataRunoppa);
            $this->set('restringidos', $this->Maestro->clasificacionesRestringidas());
        }
    }

    public function buscar_por_cedula() {
        extract($this->request->data);
        $ced_rif = $this->Interfaz->formatocedula(strtoupper($ced_rif), false);
        $cliente = $this->Cliente->find('first', array('fields' => 'Cliente.id, Cliente.nombre, Cliente.credito', 'conditions' => array('Cliente.documento' => $ced_rif, 'Cliente.estatus' => 1), 'order' => 'Cliente.id'));
        echo json_encode($cliente);
        $this->autoRender = false;
    }

    public function guardar_cliente() {
        extract($this->request->data);
        $nuevoID = str_replace('-', '', $num_form);
        if(!empty($this->request->data['id2']))
            $this->request->data['id'] = $this->Interfaz->id($this->request->data['id2']);
        $tipo_doc = "tipo_doc_$nuevoID";
        $this->request->data['tipo_doc'] = $$tipo_doc;
        $doc = "documento_$nuevoID";
        $this->request->data['documento'] = $this->Interfaz->formatocedula(strtoupper($$doc), false);
        $nombre = "nombre_$nuevoID";
        $this->request->data['nombre'] = strtoupper($$nombre);
        $tlf = "telefono_$nuevoID";
        $this->request->data['telefono'] = $this->Interfaz->formatotelefono($$tlf, false);
        $cel = "celular_$nuevoID";
        $this->request->data['celular'] = $this->Interfaz->formatotelefono($$cel, false);
        $dir = "direccion_$nuevoID";
        $this->request->data['direccion'] = strtoupper($$dir);
        $e_id = "estado_id_$nuevoID";
        $this->request->data['estado_id'] = $$e_id;
        $m_id = "municipio_id_$nuevoID";
        $this->request->data['municipio_id'] = $$m_id;
        $p_id = "parroquia_id_$nuevoID";
        $this->request->data['parroquia_id'] = $$p_id;
        $this->request->data['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
        $this->request->data['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
        $this->request->data['tipo_cliente_id'] = 1; //POR DEFECTO ES AGRICULTOR;

        $this->Cliente->query('BEGIN WORK');
        if ($this->Cliente->save($this->request->data)) {
            $idCliente = $this->Cliente->id;
            $sqlCobro = "UPDATE cobranzas.cobro_clientes SET cliente_id = $idCliente WHERE documento = '{$this->request->data['documento']}'";
            $sqlCobroDetalle = "UPDATE cobranzas.detalle_cobro_clientes SET cliente_id = $idCliente WHERE documento = '{$this->request->data['documento']}'";
            $sqlFactura = "UPDATE cobranzas.facturas SET cliente_id = $idCliente WHERE documento = '{$this->request->data['documento']}'";
            $sqlNotas = "UPDATE cobranzas.notas SET cliente_id = $idCliente WHERE documento = '{$this->request->data['documento']}'";
            $updateCobro = $this->Cliente->query($sqlCobro);
            $updateCobroDetalle = $this->Cliente->query($sqlCobroDetalle);
            $updateFactura = $this->Cliente->query($sqlFactura);
            $updateNotas = $this->Cliente->query($sqlNotas);
            
            $this->Cliente->query('COMMIT');
            echo "1_{$this->Interfaz->id_encode($this->Cliente->id)}";
        } else {
            $this->Cliente->query('ROLLBACK');
            echo "2_";
        }

        $this->autoRender = false;
    }

    public function buscarSigesil($documento) {
        $documento = trim(str_replace('-', '', $documento));
        $datosClientes = $this->Consultas->buscarSigesilFunc($documento);

        $this->set('datosClientes', $datosClientes);
        $this->render('datos_sigesil');
    }

    public function buscarSima($documento) {

        $datosCompletos = $this->Consultas->buscarSimaFunc($documento);

        if(!empty($datosCompletos)) {
        
            if ($datosCompletos[0][0]['nombre'] == "---") {
                $tipoRespuesta = 'VACIO';
                $datosClientes = '';
                $datosUnidad = '';
            }
            else if ($datosCompletos[0][0]['nombre'] == "SIN CONEXION CON SISTEMA SIMA") {

                $tipoRespuesta = 'SIN CONEXION';
                $datosClientes = '';
                $datosUnidad = '';
            }
            else if ($datosCompletos[0][0]['nombre'] != "---") {
                $tipoRespuesta = 'DATOS';
                $datosClientes['persona']['nombre'] = $datosCompletos[0][0]['nombre'];
                $datosClientes['persona']['apellido'] = $datosCompletos[0][0]['apellido'];
                $datosClientes['persona']['ced_rif'] = $datosCompletos[0][0]['ced_rif'];

                foreach ($datosCompletos as $value) {
                    $datosUnidad['unidad'][] = array_slice($value[0], 3);
                }
            }
            else {
                $tipoRespuesta = 'ERROR';
                $datosClientes = '';
                $datosUnidad = '';
            }
        }
        else {
            $tipoRespuesta = 'VACIO';
            $datosClientes = '';
            $datosUnidad = '';
        }       

        $this->set('datosClientes', $datosClientes);
        $this->set('datosUnidad', $datosUnidad);
        $this->set('tipoRespuesta', $tipoRespuesta);
        $this->render('datos_sima');
    }

    public function mas_vendido($tipoVenta = 0){
        extract($this->request->data);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $idCliente = (!empty($idCli)) ? $this->Interfaz->id($idCli) : 0;
        $objFacDet = $this->Maestro->modelo('punto', 'FacturacionDetalle', $tiendaSesion);
        $objFacDet->virtualFields['cant'] = 'SUM(FacturacionDetalle.cantidad)';
        $infoListaProductos = $masVendidos = null;
        
        if(!empty($idCliente))
            $infoListaProductos = $objFacDet->find('all', array('fields' => array('FacturacionDetalle.cant', 'FacturacionDetalle.material_id'), 'conditions' => array('FacturacionDetalle.material_id <>' => 1, 'Facturacion.cliente_id' => $idCliente), 'group' => array('FacturacionDetalle.material_id'), 'order' => array('FacturacionDetalle.cant DESC'), 'limit' => 20));
        else
            $infoListaProductos = $objFacDet->find('all', array('fields' => array('FacturacionDetalle.cant', 'FacturacionDetalle.material_id'), 'conditions' => array('FacturacionDetalle.material_id <>' => 1), 'group' => array('FacturacionDetalle.material_id'), 'order' => array('FacturacionDetalle.cant DESC'), 'limit' => 20));
        
        if(!empty($infoListaProductos)) {
            $listaProductos = array();
            foreach ($infoListaProductos as $valor) {
                $listaProductos[] = $valor['FacturacionDetalle']['material_id'];
            }

            $listaProductos = implode(', ', $listaProductos);
            $tipCli = (!empty($tipCli)) ? $tipCli : 1;
            $proId = (!empty($proId)) ? $proId : 1;
            $lapId = (!empty($lapId)) ? $lapId : 1;
            $masVendidos = $this->Material->query("SELECT * FROM fnc_buscar_mas_vendidos({$this->Interfaz->id($this->Session->read('tienda_id_trabajo'))}, 
                                                                                        $tipCli, 
                                                                                        $proId, 
                                                                                        $lapId, 
                                                                                        1, $tipoVenta, 
                                                                                        '{$listaProductos}', now()::date, $idCliente)  as (id bigint, nombre character varying(100), codigo character varying(20), imagen character varying(100), nombre_minimo character varying(20), entero smallint, impuesto double precision, precio double precision, existencia double precision, flete integer, monto_flete double precision, id_flete bigint, iva_flete double precision, serial integer, maximo double precision, supervisacion character varying(50), dias integer, venta double precision, desde date, hasta date, total double precision);");
        }

        $this->set('idClienteVenta', $idCliente);
        $this->set('tipoVenta', $tipoVenta);
        $this->set('data', $masVendidos);   
    }
    
    public function desbloquear(){
        extract($this->request->data);
        $usuario = $this->Interfaz->mayuscula($this->Session->read('username'));
        $clave = $this->Interfaz->clave($clave);
        $condiciones = array("UPPER(Usuario.usuario)" => $usuario, "Usuario.contrasena" => $clave, "Usuario.estatus" => 1);
        $datosUsuario = $this->Usuario->find('count', array('conditions' => $condiciones));
        if ($datosUsuario > 0)
            echo 1;
        else
            echo 2;

        $this->autoRender = false;
    }

     public function limite(){
        extract($this->request->data);
        $idCliVenta = $this->Interfaz->id($idCliVenta);
        $dataHistorial = $this->Material->query("SELECT * from fnc_revision_supervisado($idCliVenta, $idProducto) as (id bigint, tienda text, cantidad numeric,numero text,fecha text);");
        $this->set('dataHistorial', $dataHistorial);
    }
    
    public function buscarSeniat($documento, $nombre) {
        $consulta = $this->ConsultaLegal->find('first', array('fields' => array('ConsultaLegal.nombres', 'ConsultaLegal.agenteretencioniva', 'ConsultaLegal.contribuyenteiva', 'ConsultaLegal.tasa'), 'conditions' => array('ConsultaLegal.entidad' => 1, 'ConsultaLegal.documento' => $this->Interfaz->formatocedula($documento, false))));
        if(!empty($consulta)) {
            $opcDefecto = array();
            $opcDefecto['codigo'] = 1;
            $resultado = $this->crearArreglo($consulta['ConsultaLegal']);
            $datos = array_merge($opcDefecto, $resultado);
        } else {
            $data = array();
            $data['ConsultaLegal']['documento'] = $this->Interfaz->formatocedula($documento, false);
            $data['ConsultaLegal']['entidad'] = 1;
            list($nac, $rif) = explode('-', $documento);
            $rif = (int) $rif;
            $documento = $nac.$rif;
            $objRif = new Rif($documento);
            $datos = json_decode($objRif->obtenerInfo(), true);
            if($datos['codigo'] == 1) {
                $data['ConsultaLegal']['nombres'] = $datos['nombre'];
                $data['ConsultaLegal']['agenteretencioniva'] = $datos['agenteretencioniva'];
                $data['ConsultaLegal']['contribuyenteiva'] = $datos['contribuyenteiva'];
                $data['ConsultaLegal']['tasa'] = $datos['tasa'];
                $this->ConsultaLegal->save($data);
            }
        }
        $this->set('data', $datos);
        $this->set('nombre', $nombre);
    }
    
    public function buscarCne($documento, $nombre) {
        $consulta = $this->ConsultaLegal->find('first', array('fields' => array('ConsultaLegal.nombres', 'ConsultaLegal.apellidos', 'ConsultaLegal.inscrito', 'ConsultaLegal.estado', 'ConsultaLegal.municipio', 'ConsultaLegal.parroquia', 'ConsultaLegal.centro', 'ConsultaLegal.direccion'), 'conditions' => array('ConsultaLegal.entidad' => 2, 'ConsultaLegal.documento' => $this->Interfaz->formatocedula($documento, false))));
        if(!empty($consulta)) {
            $opcDefecto = array();
            $opcDefecto['error'] = 0;
            $resultado = $this->crearArreglo($consulta['ConsultaLegal']);
            $datos = array_merge($opcDefecto, $resultado);
        } else {
            $datos['error'] = 1;
            $dataSaime = $this->Saime->find('first', array('fields' => array('documento', 'nombre1', 'nombre2', 'apellido1', 'apellido2'), 'conditions' => array('documento' => $this->Interfaz->formatocedula($documento, false))));
            if(!empty($dataSaime)) {
                $datos['error'] = 0;
                $datos['nombres'] = $dataSaime['Saime']['nombre1'];
                if(!empty($dataSaime['Saime']['nombre2']))
                    $datos['nombres'] .= " {$dataSaime['Saime']['nombre2']}";
                $datos['apellidos'] = $dataSaime['Saime']['apellido1'];
                if(!empty($dataSaime['Saime']['apellido2']))
                    $datos['apellidos'] .= " {$dataSaime['Saime']['apellido2']}";
            }
            /*$data = array();
            $data['ConsultaLegal']['documento'] = $this->Interfaz->formatocedula($documento, false);
            $data['ConsultaLegal']['entidad'] = 2;
            list($nac, $cedula) = explode('-', $documento);
            $cedula = (int) $cedula;
            $objCne = new Cne();
            $datos = $objCne->buscarCNE($nac, $cedula);
            if($datos['error'] == 0) {
                $data['ConsultaLegal']['nombres'] = $datos['nombres'];
                $data['ConsultaLegal']['apellidos'] = $datos['apellidos'];
                $data['ConsultaLegal']['inscrito'] = $datos['inscrito'];
                $data['ConsultaLegal']['estado'] = $datos['estado'];
                $data['ConsultaLegal']['municipio'] = $datos['municipio'];
                $data['ConsultaLegal']['parroquia'] = $datos['parroquia'];
                $data['ConsultaLegal']['centro'] = $datos['centro'];
                $data['ConsultaLegal']['direccion'] = $datos['direccion'];
                $this->ConsultaLegal->save($data);
            }*/
        }
        $this->set('data', $datos);
        $this->set('nombre', $nombre);
    }
    
    public function crearArreglo($data) {
        $datos = array();
        foreach($data as $indice => $valor) {
            $datos[$indice] = $valor;
        }
        return $datos;
    }

}